# 面向对象的方式来进行封装
import jsonpath
import logging


class GetKeywords(object):
    """
    我们要去实现对 jsonpath 的二次封装
    通过 jsonpath 来获取返回值
    """

    @staticmethod
    def get_keyword(data, name, index=0):
        """
        获取 json 数据里面的一个数据
        :param data: 元数据（通常是接口响应的 JSON 数据）
        :param name: 需要提取的字段名称
        :param index: 索引，默认取第 0 个结果
        :return: 最终提取的数据；提取失败返回 False 并记录日志
        """
        try:
            # 使用 jsonpath 提取数据，语法 $..{name} 表示递归查找所有层级的 name 字段
            result = jsonpath.jsonpath(data, f"$..{name}")[index]
        except Exception as e:
            result = False
            # 提取失败时记录错误日志，说明元数据和提取的名称
            logging.error(f"jsonpath 提取失败: 原本提取的元数据是({data}), 提取的键是({name})")
        return result

    @staticmethod
    def get_keywords(data, name):
        """
        获取提取的多个数据（返回列表）
        :param data: 元数据（通常是接口响应的 JSON 数据）
        :param name: 需要提取的字段名称
        :return: 提取出来的数据列表；提取失败返回 False 并记录日志
        """
        try:
            # 使用 jsonpath 提取所有匹配的结果，返回列表
            result = jsonpath.jsonpath(data, f"$..{name}")
        except Exception as e:
            result = False
            # 提取失败时记录错误日志，说明元数据和提取的名称
            logging.error(f"jsonpath 提取失败: 原本提取的元数据是({data}), 提取的键是({name})")
        return result